stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式) 您所在的位置:网站首页 计步算法 stm32 stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式)

stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式)

2024-06-05 23:15| 来源: 网络整理| 查看: 265

stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式) 前言一、介绍ADXL345传感器二、STM32驱动使用步骤1.配置IIC通信协议2.寄存器初始化配置3.读入数据串口打印 三、成果输出

前言

本项目基于STM32F103C8T6平台驱动ADXL345模块,主要用于三轴加速度的测量,也可用于平衡性检测,跌倒检测,PID控制等领域。 大多数博客的代码带入都不能使用,经过一上午调试,终于可以获取数据了。目前可通过IIC方式驱动(当然自己可以修改成SPI驱动,因为感觉IIC驱动节约一些引脚,当然有利有弊)获取x,y,z三个方向的变化量。现在将程序工程分享出来大家一起交流学习。

温馨提示:若存在表述错误或知识性错误望海涵指出,仅供学习交流,非作者同意不可转载,感谢支持吖~

一、介绍ADXL345传感器

ADXL345是三轴加速度传感器,根据官方网站以及官方手册(https://www.analog.com/cn/products/adxl345.html#product-overview)上的描述,它具有以下特性:

1、超低功耗:VS = 2.5 V时(典型值),测量模式下低至23μA,待机模式下为0.1 μA 2、功耗随带宽自动按比例变化 3、用户可选的分辨率:10位固定分辨率/全分辨率 分辨率随g范围提高而提高,±16 g时达到最高分辨率13位(在所有g范围内保持4 mg/LSB的比例系数)

使用的模块如下图:ADXL345(GY-291) 正面图 背面图 在这里插入图片描述

根据参考手册可知,引脚号分配: 在这里插入图片描述 根据官方手册可知,通信方式可参考下表: 在这里插入图片描述 在这里插入图片描述 说明:CS接入高电平则选择IIC通信,反之则SPI通信。SDO(地址引脚)接入高电平,根据手册器件的7位I2C地址是0x1D,后面跟上读取/写入位(R/W),则写寄存器为0x3A,读寄存器为0x3B;接入低电平,则7位I2C地址是0x53,同理,跟上读写标志位后写寄存器为0xA6,读寄存器为0xA7;

那么就简要介绍以下寄存器,它的寄存器很多,但是我们只需要先关注以下三个即可 在这里插入图片描述 只需要配置好这三个寄存器就可以开始工作,其余寄存器如下图(读取数据关注0x32开始的6个寄存器即可): 在这里插入图片描述

二、STM32驱动使用步骤 1.配置IIC通信协议

可以使用硬件iic也可使用软件iic,我这里为了方便就用硬件配置了:

//配置GPIO的复用模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB,&GPIO_InitStructure); //配置IIC的外设工作条件 I2C_DeInit(I2C2); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x30; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 200000; 2.寄存器初始化配置 void adxl345_init(void) { iic_rw(0x0d, 1, BW_RATE, ADXL345_ADDR, WRITE);//数据速率以及功率模式配置 iic_rw(0x08, 1, POWER_CTL, ADXL345_ADDR, WRITE);//省电特性配置 iic_rw(0x09, 1, DATA_FORMAT, ADXL345_ADDR, WRITE);//数据格式控制 } 3.读入数据串口打印

通过读寄存器的值来读取此时三轴加速度三方位的状态(这里是通过16位的数据格式获取,大家可配置,最大值为65535,将读取的数值转化为16位整型数据):

void adxl345_get_data(u16 *aax, u16 *aay, u16 *aaz) { u8 data_rev[6]; iic_rw(&data_buf[0], 6, ADXL345_BURST_ADDR, ADXL345_ADDR, READ); *aax = data_rev[1] * 0x100 + data_rev[0]; *aay = data_rev[3] * 0x100 + data_rev[2]; *aaz = data_rev[5] * 0x100 + data_rev[4]; } adxl345_get_data(x_temp, y_temp,z_temp); printf("x is %d,y is %d,z is %d \r\n",*x_temp,*y_temp,*z_temp);

获取x,y,z的值将其串口打印。

三、成果输出

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

通过更改ADXL345模块方位,摇晃等,可以明显看出xyz发送了改变,说明我们已经驱动ADXL345模块,同时能获取相关数据。可后期对该数据进行采集,平均值,卡尔曼滤波等处理,使得更加稳定。

CSDN工程下载链接(已调试通过):https://download.csdn.net/download/qq_40249327/16822565



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有